<?php
//function __autoload($classname){require(SITE_DIR."/core/wizard/".$classname.".class.php");}
/**
 * GeoWizard
 *
 * @package
 * @author yarland.ru
 * @copyright игорь
 * @version 2008
 * @access public
 */
class GeoWizard extends Wizard
{
	var $db;
	var $table = 'geo_adress';
	var $pfx = 'geo_';
	var $pid = 'geo_id';
	var $table_prefix = 'geo_prefix';
	var $table_index = 'geo_index';
	/**
	 * GeoWizard::__construct()
	 * 
	 * @param MyDB $db
	 * @param string $tablename
	 * @param string $pfx
	 * @param string $pid
	 * @return void
	 */
	function __construct(MyDB $db, $tablename = '',$pfx = '',$pid = '')
	{
		$this->db = $db;
		if(strlen($tablename) > 0){$this->table = mysql_real_escape_string($tablename);}
		if(strlen($pfx) > 0){$this->pfx = mysql_real_escape_string($pfx);}
		if(strlen($pid) > 0){$this->pid = $pid;}
		$this->table_prefix = $this->pfx.'prefix';
		$this->table_index = $this->pfx.'index';
	}
	/**
	 * GeoWizard::getFullAdress()
	 *
	 * @param integer $id
	 * @return array $fullAdress
	 */
	function getFullAdress($id = 0)
	{
		$id = intval($id);
		$fullAdress = array();
		if($id > 0)
		{
			$sql_fullAdress = "
			SELECT a.*,pfx.title AS pfx_title
			FROM $this->table AS a
			LEFT JOIN $this->table_prefix AS pfx ON a.pfx_id = pfx.id
			WHERE a.id='$id' LIMIT 1";
			$part = $this->db->fetch_array($sql_fullAdress,MYSQL_ASSOC);
			if(isset($part[0]['parent'])) $fullAdress = array_merge($this->getFullAdress($part[0]['parent']),$part);
		}
		return $fullAdress;
	}
	/**
	 * GeoWizard::getAdressPart()
	 *
	 * @param integer $id
	 * @return array $AdressPart|false on error
	 */
	function getAdressPart($id = 0)
	{
		$id = intval($id);
		$AdressPart = array();
		if($id > 0)
		{
			$sql_AdressPart = "
			SELECT a.*,pfx.title AS pfx_title
			FROM $this->table AS a
			LEFT JOIN $this->table_prefix AS pfx ON a.pfx_id=pfx.id
			WHERE a.id='$id'";
			$AdressPart = $this->db->fetch_one($sql_AdressPart,MYSQL_ASSOC);
			if(!empty($AdressPart))
			{
				return $AdressPart;
			}
			else return false;
		}
		else return false;
	}
	/**
	 * GeoWizard::getFullAdressesForFirm()
	 *
	 * @param integer $firm_id
	 * @return array $addresses
	 */
	function getFullAdressesForFirm($firm_id = 0)
	{
		$firm_id=intval($firm_id);
		$addresses = array();
		$firm_adress_table = $this->db->pfx.'firm_adress';
		if($firm_id!=0)
		{
		    // выбираем адреса организации
		    $addresses = $this->db->fetch_array("SELECT SQL_CALC_FOUND_ROWS * FROM $firm_adress_table WHERE catalog_id = '".$firm_id."'",MYSQL_ASSOC);
			$kolvo=$this->db->fetch_one("SELECT FOUND_ROWS()");
			if ($kolvo[0]>'0')
			{
				$adress_string=array();
				foreach($addresses as $k=>$v)
				{
					foreach($v as $id=>$value)
					{
						if($id!='id' and $id!='dop_info' and $id!='catalog_id' and $id!='shirota' and $id!='dolgota' and $id != 'validYandex')
						{
							$table_name = str_ireplace("_id","",$id);
							$sql=$this->db->fetch_one("
							SELECT
							a.*,pfx.title AS pfx_title
							FROM $this->table AS a
							LEFT JOIN $this->table_prefix AS pfx ON a.pfx_id=pfx.id
							WHERE a.id='$value' AND a.type='$table_name'");
							$adress_string[$table_name]=$sql;
						}
					}
					$addresses[$k]=$adress_string;
					$addresses[$k]['id']=$v['id'];
					$addresses[$k]['catalog_id']=$v['catalog_id'];
					$addresses[$k]['dop_info']=$v['dop_info'];
					$addresses[$k]['shirota']=$v['shirota'];
					$addresses[$k]['dolgota']=$v['dolgota'];
					$addresses[$k]['validYandex']=$v['validYandex'];
				}
		    	$item['address_kolvo']=$kolvo[0];
		    	$item['adress']=$addresses;
			}
			return $addresses;
		}
	}
	/**
	 * GeoWizard::recurse_adresses_for_html()
	 * Возвращает html, содержащий набор <option> с отступами соответственно положению элемента в иерархическом дереве
	 * Все параметры приводятся к объявленным для функции типам
	 * @param integer $parent верхний уровень дерева
	 * @param integer $selected ID элемента, который должен быть выбран
	 * @param integer $level_limiter глубина рекурсии
	 * @param integer $padding отступ слева для узла дерева
	 * @param string $padding_element текстовый элемент, используемый для отступа слева в узлах дерева
	 * @param integer $level служебная переменная - определяет глубину рекурсии для текущего элемента
	 * @return string
	 */
	function recurse_adresses_for_html($parent = 0, $selected = 0, $level_limiter = 0,$padding=3,$padding_element='&nbsp;',$level = 0)
	{
		$parent = intval($parent);
		$level = intval($level);
		$selected = intval($selected);
		$level_limiter = intval($level_limiter);
		$padding = intval($padding);
		$padding_element = strval($padding_element);
		$str = '';
		$query = "
		SELECT
		a.*,pfx.title AS pfx_title
		FROM $this->table AS a
		LEFT JOIN $this->table_prefix AS pfx ON a.pfx_id=pfx.id
		WHERE a.parent = '$parent' AND a.id<>'0' ORDER BY a.title";
		$sql = $db->query($query, __FILE__, __LINE__);
		if ($db->nums($sql) > 0)
		{
			$i = 0;
			while ($row = $db->fetch($sql))
			{
				$str .= '<option value="'.$row['id'].'"'.((intval($selected)==$row['id'])?' selected':'').'>'.(($level>0)?str_repeat($padding_element, $level*$padding):'').$row['pfx_title'].' '.$row['title'].'</option>';
	    		$next_level = $level + 1;
	    		if($level_limiter == 0 or $level_limiter >= $level)
					$str .= $this->recurse_adresses_for_html($row['id'],$selected,$level_limiter,$padding,$padding_element,$next_level);
			}
		}
		return $str;
	}
	/**
	 * GeoWizard::recurseAdresses()
	 * Функция рекурсивного извлечения информации о частях адреса для заданного родительского элемента
	 * Возвращает массив вида array('pages'=>array(),'inside_selected'=>0|1), где pages это многомерный рекурсивный массив, а inside_selected - флаг, позволяющий определить, имеются ли внутри этого узла выбранные элементы (передаются через параметр $selected)
	 * @param integer $parent ID корня дерева
	 * @param array $selected одномерный массив с выбранными элементами
	 * @param integer $level_limiter ограничитель рекурсии заданным уровнем
	 * @param integer $level служебная переменная, счетчик текущего уровня для узла
	 * @return array
	 */
	function recurseAdresses($parent = 0,array $selected,$level_limiter=0,$level = 1)
	{
		$pages = array();
		$query = "
		SELECT
		a.*,pfx.title AS pfx_title,(SELECT count(*) FROM $this->table WHERE parent=a.id) AS childs
		FROM $this->table AS a
		LEFT JOIN $this->table_prefix AS pfx ON a.pfx_id=pfx.id
		WHERE a.parent = '$parent' AND a.id <> '0'
		ORDER BY a.title";
		$rows = $this->db->fetch_array($query);
		$inside_selected='0';
		$i = 0;
		foreach ($rows as $k=>$row)
		{

			$pages[$i]['id'] = $row['id'];
            if (in_array($row['id'], $selected))
    		{
    			$pages[$i]['selected'] = 'selected';
    			$inside_selected='1';
    		}
			$pages[$i]['title'] = $row['title'];
			$pages[$i]['level'] = $level;
			$pages[$i]['type'] = $row['type'];
			$pages[$i]['index'] = $row['index'];
			$pages[$i]['pfx_title'] = $row['pfx_title'];
			$pages[$i]['childs'] = $row['childs'];

			$next_level = $level + 1;
			if($level_limiter==0 or $next_level<=$level_limiter)
			{
				if (intval($pages[$i]['childs']) >0)
				{
					$sub = $this->recurseAdresses($row['id'],$selected,$level_limiter,$next_level);
		            $pages[$i]['sub'] = $sub['pages'];
					if($sub['inside_selected']=='1')
					{
						$pages[$i]['inside_selected']='1';
						$inside_selected='1';
					}
				}
			}
			$i++;
		}

		return array('pages'=>$pages,'inside_selected'=>$inside_selected);
	}
}
?>